package xdu.lz.stage2_design_pattern.chapter7_future_pattern;


public class AsynFuture<T> implements Future<T> {


    private volatile boolean done = false;

    private T result;

    public void done(T result) {
        synchronized (this) {
            this.result = result;
            this.done = true;
            //take 和done的调用不一定是同一个线程
            // get是main线程调用的
            // done是submit后[main线程]另开辟的一个新线程调用的
            this.notifyAll();
        }
    }


    @Override
    public T get() throws InterruptedException {
        synchronized (this) {
            //没有执行完成则一直阻塞
            while (!done) {
                //让调用方法的线程阻塞，等待获取结果
                this.wait();
            }
        }
        return result;
    }

    @Override
    public T tryGet(long mills) throws InterruptedException, TimeOutException {

        synchronized (this) {
            while (!done) {
                this.wait(mills);
                if (!done) {
                    throw new TimeOutException("超时");
                }
            }
        }
        return result;
    }
}
